package com.adee.java.commons.pool2;


import org.apache.commons.pool2.impl.GenericObjectPool;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.junit.Test;

import java.time.Duration;

/**
 * PooledObjectFactory是一个池化对象工厂接口，定义了生成对象、激活对象、钝化对象、销毁对象的方法
 * 如果需要使用Commons-Pool构建构建自己的池应用，那么就需要提供一个PooledObjectFactory接口的具
 * 体实现。当然也可以继承BasePooledObjectFactory这个抽象类。本文实现PooledObjectFactory接口
 *
 * 池中对象状态：ALLOCATE（使用中）、IDLE（空闲）
 *
 * commons-pool2构建对象池步骤：
 * 1.提供一个PooledObjectFactory接口的具体实现StringPooledObjectFactory。当然也可以继承BasePooledObjectFactory这个抽象类；
 * 2.创建对象池，在org.apache.commons.pool2.impl中有三个可以直接使用的对象池：GenericObjectPool、
 * GenericKeyedObjectPool和SoftReferenceObjectPool。通常使用GenericObjectPool来创建对象池，如
 * 果是对象池是Keyed的，那么可以使用GenericKeyedObjectPool来创建对象池。而SoftReferenceObjectPool
 * 对象池，它利用一个java.util.ArrayList对象来保存对象池里的对象。不过它并不在对象池里直接保存对象本身，
 * 而是保存它们的“软引用”。
 * 3.
 *
 */
public class CommonsPool2Test {
    @Test
    public void test() {
        GenericObjectPoolConfig<String> config = new GenericObjectPoolConfig<String>();
        config.setMinIdle(3);
        config.setMaxIdle(5);
        config.setMaxTotal(8);
        config.setMaxWait(Duration.ofSeconds(15));
        GenericObjectPool<String> pool = new GenericObjectPool<String>(new StringPooledObjectFactory(), config);
        for(int i=0; i<15; i++){
            System.out.println(i+":");
            try {
                String str = pool.borrowObject();
                System.out.println(str);
                pool.returnObject(str);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}
